<?php

namespace app\model;

use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
use think\facade\Db;
use think\Model;

/**
 * Class Common
 * @package projects\model
 * @author Du
 * @date 2021/2/25
 * @time 17:08
 */
class Common
{

    /**
     * 获取列表分页数据
     *
     * @param string $table 表名
     * @param array $filter 条件
     * @param array $field 查询字段
     * @param int $page 页码
     * @param int $pageSize 获取条数
     * @param string $orderName 排序字段 默认 id
     * @param string $orderSort 排序规则 默认 desc
     * @param bool $isDel 过滤删除记录 默认 false
     * @return array
     * @throws DataNotFoundException
     * @throws DbException
     * @throws ModelNotFoundException
     * @author Du
     * @date 2021/3/29 17:50
     */
    public static function getList(string $table = '', array $filter = [], array $field = [], int $page = 1, int $pageSize = 10, string $orderName = 'id', string $orderSort = 'desc', bool $isDel = true): array
    {
        $db = Db::table($table)->where($filter)->field($field);
        if ($isDel) {
            $db->where('delete_time', 0);
        }
        return [
            'count' => $db->count(),
            'data' => $db->order($orderName, $orderSort)
                ->page($page, $pageSize)
                ->select()
                ->toArray(),
        ];
    }

    /**
     * 查询单条数据
     *
     * User : Du
     * Date : 2022/1/8
     * Time : 11:28
     * @param string $table
     * @param array $filter
     * @param array $field
     * @param bool $isDel
     * @return array|Model|null
     * @throws DataNotFoundException
     * @throws DbException
     * @throws ModelNotFoundException
     */
    public static function getData(string $table = '', array $filter = [], array $field = [], bool $isDel = false)
    {
        $db = Db::table($table)->where($filter)->field($field);
        if ($isDel) {
            $db->where('delete_time', 0);
        }
        return $db->find();
    }

    /**
     * 获取全部数据
     *
     * User : Du
     * Date : 2022/3/31
     * Time : 11:15
     * @param string $table 表名
     * @param array $filter 条件
     * @param array $field 字段
     * @param bool $isDel 是否过滤删除数据 默认：false
     * @param string $orderName 排序字段 默认：id
     * @param string $orderSort 排序规则 默认：desc
     * @return array
     * @throws DataNotFoundException
     * @throws DbException
     * @throws ModelNotFoundException
     */
    public static function getAllData(string $table = '', array $filter = [], array $field = [], bool $isDel = false, string $orderName = 'id', string $orderSort = 'desc'): array
    {
        $db = Db::table($table)->where($filter)->field($field);
        if ($isDel) {
            $db->where('delete_time', 0);
        }
        return [
            'count' => $db->count(),
            'data' => $db->order($orderName, $orderSort)->select()->toArray(),
        ];
    }

    /**
     * 获取指定字段值
     * User : Du
     * Date : 2022/11/23
     * Time : 16:54
     * @param string $table
     * @param array $filter
     * @param string $filed
     * @return mixed
     */
    public static function getValue(string $table, array $filter, string $filed)
    {
        return Db::table($table)->where($filter)->value($filed);
    }

    /**
     * json字段数据查询
     * User : Du
     * Date : 2022/4/28
     * Time : 10:14
     * @param string $table
     * @param array $jsonField
     * @param array $filter
     * @param array $field
     * @return array
     * @throws DataNotFoundException
     * @throws DbException
     * @throws ModelNotFoundException
     */
    public static function getAllJsonData(string $table = '', array $jsonField = [], array $filter = [], array $field = []): array
    {
        $db = Db::table($table)->json($jsonField)->where($filter)->field($field);
        return [
            'count' => $db->count(),
            'data' => $db->select()->toArray(),
        ];
    }

    /**
     * 添加数据
     *
     * @param string $table 表名
     * @param array $data 需要添加记录的数据
     * @param bool $getId 是否获取增加数据记录的id
     * @return int|string
     * @author Du
     * @date 2021/3/4 15:34
     */
    public static function addData(string $table = '', array $data = [], bool $getId = false)
    {
        if (!isset($data['create_time']) && in_array('create_time', Db::table($table)->getTableFields())) {
            $data['create_time'] = time();
        }
        if ($getId) {
            return Db::table($table)->strict(false)->insertGetId($data);
        } else {
            return Db::table($table)->strict(false)->data($data)->insert();
        }
    }

    /**
     * 批量添加数据
     * @param string $table
     * @param array $data
     * @return int
     */
    public static function addAllData(string $table = '', array $data = []): int
    {
        if (in_array('create_time', Db::table($table)->getTableFields())) {
            foreach ($data as $v) {
                $v['create_time'] = time();
            }
        }
        return Db::table($table)->strict(false)->insertAll($data);
    }

    /**
     * 更新数据
     *
     * @param string $table 表名
     * @param array $filter 条件
     * @param array $data 更新数据
     * @return int
     * @throws DbException
     * @author Du
     * @date 2021/3/29 17:21
     */
    public static function updateData(string $table = '', array $filter = [], array $data = []): int
    {
        if (!isset($data['update_time']) && in_array('update_time', Db::table($table)->getTableFields())) {
            $data['update_time'] = time();
        }
        return Db::table($table)->strict(false)->where($filter)->data($data)->update();
    }

    /**
     * 更新json字段数据
     *
     * User : Du
     * Date : 2022/4/28
     * Time : 10:04
     * @param string $table
     * @param array $field
     * @param array $filter
     * @param array $data
     * @return int
     * @throws DbException
     */
    public static function updateJsonData(string $table = '', array $field = [], array $filter = [], array $data = []): int
    {
        return Db::table($table)->strict(false)->json($field)->where($filter)->data($data)->update();
    }

    /**
     * 字段值自增
     *
     * @param string $table 表名
     * @param array $filter 条件
     * @param string $field 字段名
     * @param int $number 增加值 默认 1
     * @return int
     * @throws DbException
     * @author Du
     * @date 2021/3/29 17:17
     */
    public static function fieldInc(string $table = '', array $filter = [], string $field = '', int $number = 1): int
    {
        return Db::table($table)->where($filter)->inc($field, $number)->update();
    }

    /**
     * 字段值自减
     *
     * @param string $table 表名
     * @param array $filter 条件
     * @param string $field 字段名
     * @param int $number 减少值 默认 1
     * @return int
     * @throws DbException
     */
    public static function fieldDec(string $table = '', array $filter = [], string $field = '', int $number = 1): int
    {
        return Db::table($table)->where($filter)->dec($field, $number)->update();
    }

    /**
     * 获取最后一个插入的id
     *
     * @param string $table 表名
     * @return mixed
     * @author Du
     * @date 2021/3/31 17:38
     */
    public static function getLastId(string $table = '')
    {
        return Db::table($table)->getLastInsID();
    }

    /**
     * 根据条件获取符合的数量
     *
     * @param string $table 表名
     * @param array $filter 条件
     * @return int
     * @throws DbException
     * @author Du
     * @date 2021/3/31 17:40
     */
    public static function getCount(string $table = '', array $filter = []): int
    {
        return Db::table($table)->where($filter)->count();
    }

    /**
     * 删除表数据
     *
     * @param string $table 表名
     * @param array $filter 条件
     * @param bool $isDelete 软删除记录 默认 true
     * User : du
     * Date : 2022/3/1
     * Time : 11:18
     * @return int|string
     * @throws DbException
     */
    public static function deleteData(string $table = '', array $filter = [], bool $isDelete = false)
    {
        if ($isDelete) {
            return Db::table($table)->where($filter)->delete();
        } else {
            $data['delete_time'] = time();
            return Db::table($table)->where($filter)->data($data)->save();
        }
    }

    /**
     * 获取指定列值
     *
     * User : Du
     * Date : 2022/3/25
     * Time : 15:22
     * @param string $table
     * @param array $filter
     * @param array $field
     * @return array
     */
    public static function getColumn(string $table = '', array $filter = [], array $field = []): array
    {
        return Db::table($table)->where($filter)->column($field);
    }

}